#include <iostream>

template<typename T>
class DynamicArray  //类模板显式实例化
{
public:
    DynamicArray():size(0),capacity(15)
    {
        a = new T[capacity];
    }

    void Insert(const T& value);
    //友元声明不会共享类的模板，友元声明也要声明自己的模板
    //友元声明的模板不能和类模板重名
    template<typename U>
    friend std::ostream & operator<<(std::ostream& os, const DynamicArray<U> & da);

private:
    T * a;
    int size;
    int capacity;
};


template<typename T>
std::ostream & operator<<(std::ostream& os, const DynamicArray<T> & da)
{
    for(int i = 0 ; i < da.size; i++)
    {
        os<<da.a[i]<<" ";
    }
    os<<std::endl;
    return os;
}

template<typename T>
void DynamicArray<T>::Insert(const T &value)
{
    if(size == capacity)
    {
        capacity *= 2;
        T *newP = new T[capacity];
        for(int i = 0; i < size; i++)
        {
            newP[i] = a[i];
        }
        delete []a;
        a = newP;
    }
    a[size++] = value;
}

// int main()
// {
//     // DynamicArray<int> da;
//     // da.Insert(2);
//     // da.Insert(3);
//     // da.Insert(1);
//     // std::cout<<da;

//     // DynamicArray<std::string> da;
//     // da.Insert("hello");
//     // da.Insert("world");
//     // da.Insert("hahaha");
//     // std::cout<<da;
    
//     return 0;
// }
